最近帮朋友做一个标准的WEB管理会员系统,到了项目开发后期,才发现一个非常致命的问题:中文乱码。
ok,具体问题是这样的:在eclipse+tomcat开发环境运行下,前台用火狐、谷歌浏览器以及IE运行都不会出现前台输入中文,后台接收乱码的情况。但在单纯运行环境tomcat server部署war允许下,就会出现前台输入中文,后台java接收字符乱码
可能很多同学就会说,你可能是前台jsp文件没有强制和后台开发语言设置相同的编码格式,所以会出现前台传入后台乱码的情况。但实际上的情况是,我已经完全统一了全部编码格式为UTF-8,前台和后台以及数据库的编码格式完全一致,这就解释了为什么在eclipse开发环境下可以运行,且不存在任何乱码。
现在问题就出现了,很灵异。在tomcat纯运行情况下,就会出现乱码。我就在考虑是否是tomcat服务器上的字符设置,然后就去网上搜各种修改tomcat server.xml的配置,呵呵,结果是失败的。然后我就各种抓狂,尝试去查看乱码格式,结果猜出来乱码为GBK,在后台用new String(str.getByte("gbk"),"utf-8")这样是可以将乱码文字解码。哈哈哈,如果你认为这个问题就这样解决了,你就天真了。这样的解码只能对偶数个中文有用,对奇数个中文就会存在或首或尾出现乱码,这样的话,整个问题是完全没解决到的。不过好在,用猜出来,从浏览器过来的中文格式是gbk,然而这并没有什么用。其实现在都还真的没有搞懂,为何从在限制jsp context编码utf-8的情况下,为何会传gbk这种编码过来。
这个问题已经到了困扰到用户不能直接用的地步,所以必须先解决。然后就各种在网上搜,最后发现,又可能是数据从浏览器端传出的时候被更改,所以去排查所以跟输入中文有关的地方,发现,我项目绝大多数的地方都用了AJAX,then我将能form提交的地方都改了,然后强制accept-charset="utf-8",最后解决了乱码问题。
当然这不是重点,因为从根本上没有解决AJAX post 中文乱码的问题。你不能说整个项目都不用AJAX(对于界面局部刷新是必须的),这是几乎不可能的。所以,我还是得硬着头皮继续找解决方法。网上搜前台编码,排除很多,一个一个试,最后找到了方法:在前台js用AJAX之前,将所要传送的中文值强制编码:encodeURIComponent(eval(document.getElementById('username')).value),然后后台用java.net.URLDecoder.decode(user.getUsername(), "utf-8");这样就完美解决了AJAX传中文的问题。
这样解决方案是比较暴力的了,如果你的项目有上几十甚至上百的页面用到ajax传中文值,那就呵呵了。这也是我写这篇文章的初衷,希望有更多的大牛看到,从而找出更好解决办法。
最后希望这篇文章对有相同问题的同学有用,因为我也是在遇到问题的时候希望可以得到帮助。
最后祝各位 have nice day!


rainbow0521
3 声望2 粉丝

快乐的包子弟弟妈妈